import 'dart:collection';
import 'package:flutter/material.dart';

import 'package:lianjinta/utils/theme.dart';
import 'package:lianjinta/core/types/alchemy_element.dart';

class StoryEntry {
  StoryEntry({
    required this.titleKey,
    required this.descriptionKey,
    this.compendiumColor = GameColors.grey50,
    this.assetPath,
    this.rarity = 'common',
    this.followUpStage,
    this.unlockedElement,
    this.audioPath = 'effect_magic.mp3',
  });

  final String titleKey;
  final String descriptionKey;
  final Color compendiumColor;
  final String? assetPath;
  final String rarity;
  final int? followUpStage;
  final AlchemyElement? unlockedElement;
  final String audioPath;
}

abstract class GameStory {
  static const Map<String, String> _lines = {
    'error_fallback': 'Error: provided key is null',
    'app_title': '炼金塔',
    'app_subtitle': '展现您的炼金实力',
    'screen_too_small': '不幸的是，这个屏幕太小了，无法支持……\n😢',
    'repo_link': '',
    'finish_board': '炼金合成',
    'reset_board': '清空炼金板',
    'close_dialog': '关闭',
    'materia_nulla_desc': '出现错误?',
    'materia_incognita_desc': '谁知道这是什么?',
    'materia_prima_desc':
        '本源是最基本的根本材料，隐藏在所有已知的炼金术之下。它具有较低的魔法效力，因此，为了在炼金术上有用，它需要合并成更活泼的炼金物质。虽然相对丰富，但由于其灰色的颜色，它经常被忽视为一种非魔法矿物。初质料据说来自于流星的内核。',
    'rebis_desc':
        '在水生植物的根中可以找到极少量的勒比。这意味着通过合并来生产它更加可行。传统上认为它是植物存在的副产品，但根据最近发现的微生物，一些学者认为勒比可能是由植物产生的。当食用它时，它有刺激作用，可以延迟睡眠。',
    'caeleum_desc':
        '在自然界的水生环境中可以发现雕具星。它是由生活在南群岛沿海的植物状微生物产生的，并几乎立即被消耗掉。夏季，在雕具岛的沿海水域可以看到数量最多的这种生物(这就是它的名字)。因为它在被召唤后会在几秒钟内消散，所以没有可行的自然提取方法。',
    'quebrith_desc':
        '白简木是一种剧毒物质，只能用汞合法生产。由于它与涅克尔斯克围城期间的集体自杀有关联，它在所有王国和联邦中要么被取缔，要么被高度管制。当食用时，它会引起强烈的恶心，紧接着是心脏骤停。目前还没有已知的解药，然而，许多炼金术士似乎随着时间的推移产生了免疫力。',
    'aether_desc':
        '以太就像白简木一样在自然界中不能被发现，需要合并才能获得。少量的以太具有镇静作用，常用于治疗疼痛、焦虑、痛苦和癫痫。然而，如果过量，它会导致失忆、偏执、攻击和呼吸短促，有时还会导致窒息死亡。',
    'vermilion_desc':
        '天然的朱红可以在干果中发现微量，特别是在金覆盆子和奶油樱桃中。目前，工业上正在努力开发用这种方法来替代传统的合并方法来获取朱红。少量时，它有一种宜人的果香，常用于香水中。但如果量大了，它散发着腐烂和粪便的臭味。',
    'materia_optima_desc':
        '顶级材料是最难融合的材料。大多数炼金术士花了数年的时间来探索，只是为了能够聚集足够的力量来完成合并过程。它对大脑有很大的影响，使它的用户学习得更快。另一方面，当处理不当时，它可以在几个小时内清除记忆，因此只给有前途的炼金术学徒，以减少风险。',
    'quest_title_0': '欢迎来到炼金塔',
    'quest_desc_0':
        '《炼金塔》是一款关于发现和获得终极炼金术能力的游戏。要做到这一点，你需要在炼金板上以特殊的排列矩阵安排所有材料位置。通过点击材料，你可以将它移到相邻的空白区域。',
    'quest_title_50': '第一项任务',
    'quest_desc_50':
        '“在炼金塔充满煤烟、烛光的房间里，我彻夜难眠，把各种物质和火盐混合在一起，完全失去了嗅觉。没时间睡觉了，国王的军队随时都可能到达皮尔特林。”\n\n在信封里，你找到一张小图片。你很快记住了它，然后它完全消失在空气中。\n\n请按照图片排列完成材料的排列，完成后，记住要进行炼金合并。',
    'quest_title_100': '发现勒比',
    'quest_desc_100':
        '《炼金本志》中的大多数合成物都要求使用上等材料。要将它们添加到面板上\n\n在炼金仓库中选择材料图标，需要所少材料，便点击多少次添加按钮。\n\n你可以通过点击“剧情概要”选项卡的各个标题来访问未锁定的剧情对话框。',
    'quest_title_150': '与皮尔特林的战役',
    'quest_desc_150':
        '“你真该看看他们的表情，那极度的恐惧。我不喜欢杀戮，我们的圣夫人耶利欧也不喜欢，但有时这是最有好处的。弗兰兹人赢了，弗兰兹领导者的牺牲并没有白费。我之前说过，欧特文是一个很棒的领导者。虽然他来自南群岛，但他是最早的弗兰兹人之一。他有巨大的热情，这才是取胜最重要的。”\n这个图案也是如此，当你最后仔细地看它一眼，它就消失了。',
    'quest_title_200': '发现雕具星',
    'quest_desc_200':
        '尽管是决定性的，但皮尔特林的小冲突并没有推动狂热的事业。该地区的真正力量在涅克尔斯克城。由一位男爵夫人统治，她甚至在异教徒被处决之前就采纳了疯狂的教义，这是皇家军队围攻的完美地点。——老雷蒙德，\n“弗兰兹起义”',
    'quest_title_250': '封锁涅克尔斯克',
    'quest_desc_250':
        '“我不知道接下来会发生什么。这要花多长时间?的确，我们是所有人中最顽固、最坚定的，但即便如此，我也不确定精神是否足以支撑身体。幸运的是，其他资源并不那么稀缺。我每天都要吸收大量的格布里思，这样，在紧要关头，每个人都可以光荣地通过，欧特文先生也一样……”',
    'quest_title_300': '发现白简木',
    'quest_desc_300':
        '“陛下，涅克尔斯克在黎明时分陷落，城门大开。我们派出了速度最快的侦察兵。他们回来告诉我们，涅克尔斯克真的失陷了，当我们进去后，我所看到的场景只能用可怕来形容。我的许多部下不是哭了，就是放下了武器。我对此无能为力。战争结束了，异端也结束了。”',
    'quest_title_320': '是我？不，不可能……',
    'quest_desc_320':
        '“我们的食物只能维持一两天，然后呢?”\n“我们只会慢慢饿死。男爵夫人是欧特文先生的朋友，她告诉我们，这位善良的先生坚决反对不必要的痛苦，她叫我们大家吃白简木。这事发生在黎明前，在城镇广场上举行了一场简陋的宴会之后。我觉得好像喝了很多，但我并不觉得恶心。”',
    'quest_title_360': '没错！就是我！',
    'quest_desc_360':
        '“当每个人都开始像苍蝇一样倒下时，我意识到——我对白简木免疫。我吃了一些以太来减轻我的恶心感，打开门，然后逃跑了。”',
    'quest_title_400': '发现以太',
    'quest_desc_400':
        '当涅克尔斯克被击败的消息开始流传的时候，许多农民，异端学说的忠实追随者，开始怀疑了。在拥护正统和皇室的主教的帮助下，这种怀疑变成了不信任，后来变成了仇恨。 - 简·司凯琳\n“说说我们的南方邻居”',
    'quest_title_450': '拒绝心中的梦',
    'quest_desc_450':
        '“在我到达罗金后，我尽量远离神秘的炼金术。我不再剪头发，不常洗澡，尽我所能与市民打成一片。我开了一家药店，赚了一些钱，一段时间后，我开始有了回到家乡的感觉。直到有一天，一个贵族进来。他要了朱红香水，把一个很大的钱包扔在柜台上。贪婪让我忘记了本心。”',
    'quest_title_500': '发现朱红',
    'quest_desc_500':
        '后来人们发现，罗金的受害者是马丁·冯·康斯坦茨，他是一个富有的贵族的儿子，当时他正在镇上寻找订婚礼物。在他上马的时候，一小瓶朱红香水从他的口袋里掉了出来，砸在街上的鹅卵石上。大量朱红有一种恶臭挥之不去的气味，往往被错误地认为是无味但有毒的白简木。公众对发生在涅克尔斯克的事件记忆犹新，马丁成了一群暴民私刑的受害者。-芭芭拉·沙夫\n《犯罪百科全书》',
    'quest_title_550': '遗忘之水',
    'quest_desc_550': '“我的炼金术之旅从炼金塔开始，也将从这里随之结束。”',
    'quest_title_600': '直到没有尽头',
    'quest_desc_600': '当你开始合并的过程，你开始感到有点头晕。突然……',
    'quest_title_650': '刚才发生了什么?',
    'quest_desc_650': '刚才发生了什么?我…我不记得了。你呢?',
    'helper_title_2137': '融合失败',
    'helper_desc_2137': '在炼金术矩阵完全完成之前就进行合并是极其危险的，不要愚蠢的尝试这样做。',
    'helper_title_6969': '炼金板无空余位置',
    'helper_desc_6969': '没有更多的炼金材料在板上更换。在再次添加其他内容之前，您可以尝试清除它。',
  };

  static String getLine(String key) => _lines[key] ?? 'Error: no line found';

  static final LinkedHashMap<int, StoryEntry> storyEntries =
      LinkedHashMap.from({
    0: StoryEntry(
      titleKey: 'quest_title_0',
      descriptionKey: 'quest_desc_0',
      followUpStage: 50,
    ),
    50: StoryEntry(
      titleKey: 'quest_title_50',
      descriptionKey: 'quest_desc_50',
      assetPath: 'patterns/rebis_recipe.webp',
      audioPath: 'effect_50.mp3',
    ),
    100: StoryEntry(
      titleKey: 'quest_title_100',
      descriptionKey: 'quest_desc_100',
      compendiumColor: GameColors.green,
      followUpStage: 150,
      rarity: 'uncommon',
      unlockedElement: AlchemyElement.rebis,
    ),
    150: StoryEntry(
      titleKey: 'quest_title_150',
      descriptionKey: 'quest_desc_150',
      assetPath: 'patterns/caeleum_recipe.webp',
      audioPath: 'effect_150.mp3',
    ),
    200: StoryEntry(
      titleKey: 'quest_title_200',
      descriptionKey: 'quest_desc_200',
      compendiumColor: GameColors.blue,
      followUpStage: 250,
      rarity: 'rare',
      unlockedElement: AlchemyElement.caeleum,
    ),
    250: StoryEntry(
      titleKey: 'quest_title_250',
      descriptionKey: 'quest_desc_250',
      assetPath: 'patterns/quebrith_recipe.webp',
      audioPath: 'effect_250.mp3',
    ),
    300: StoryEntry(
      titleKey: 'quest_title_300',
      descriptionKey: 'quest_desc_300',
      compendiumColor: GameColors.violet,
      followUpStage: 320,
      rarity: 'unique',
      unlockedElement: AlchemyElement.quebrith,
      audioPath: 'effect_300.mp3',
    ),
    320: StoryEntry(
      titleKey: 'quest_title_320',
      descriptionKey: 'quest_desc_320',
      followUpStage: 360,
      audioPath: 'effect_320.mp3',
    ),
    360: StoryEntry(
      titleKey: 'quest_title_360',
      descriptionKey: 'quest_desc_360',
      assetPath: 'patterns/aether_recipe.webp',
    ),
    400: StoryEntry(
      titleKey: 'quest_title_400',
      descriptionKey: 'quest_desc_400',
      compendiumColor: GameColors.orange,
      rarity: 'exceptional',
      followUpStage: 450,
      unlockedElement: AlchemyElement.aether,
    ),
    450: StoryEntry(
      titleKey: 'quest_title_450',
      descriptionKey: 'quest_desc_450',
      assetPath: 'patterns/vermilion_recipe.webp',
      audioPath: 'effect_450.mp3',
    ),
    500: StoryEntry(
      titleKey: 'quest_title_500',
      descriptionKey: 'quest_desc_500',
      compendiumColor: GameColors.yellow,
      rarity: 'legendary',
      followUpStage: 550,
      unlockedElement: AlchemyElement.vermilion,
    ),
    550: StoryEntry(
      titleKey: 'quest_title_550',
      descriptionKey: 'quest_desc_550',
      assetPath: 'patterns/materia_optima_recipe.webp',
    ),
    600: StoryEntry(
      titleKey: 'quest_title_600',
      descriptionKey: 'quest_desc_600',
      compendiumColor: GameColors.white,
      rarity: 'optima',
      followUpStage: 650,
      unlockedElement: AlchemyElement.materiaOptima,
    ),
    650: StoryEntry(
      titleKey: 'quest_title_650',
      descriptionKey: 'quest_desc_650',
      compendiumColor: GameColors.white,
      rarity: 'optima',
      audioPath: 'effect_650.mp3',
    ),
    2137: StoryEntry(
      titleKey: 'helper_title_2137',
      descriptionKey: 'helper_desc_2137',
      audioPath: 'effect_fail_alt.mp3',
    ),
    6969: StoryEntry(
      titleKey: 'helper_title_6969',
      descriptionKey: 'helper_desc_6969',
      audioPath: 'effect_fail_alt.mp3',
    ),
  });
}
